package com.qf.service.impl;

import com.qf.common.core.domain.AjaxResult;
import com.qf.common.utils.SecurityUtils;
import com.qf.common.utils.bean.BeanUtils;
import com.qf.domain.SysAttendance;
import com.qf.mapper.MyAttendanceMapper;
import com.qf.service.IMyAttendanceService;
import com.qf.system.service.ISysDictDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class MyAttendanceServiceImpl implements IMyAttendanceService {
    @Autowired
    private MyAttendanceMapper attendanceMapper;

    @Autowired
    private ISysDictDataService dictDataService; // 若依字典服务，用于获取状态标签

    // 时间格式化（判断打卡时段）
    private static final SimpleDateFormat HOUR_FORMAT = new SimpleDateFormat("HH");
    private static final int MORNING_START = 8;  // 上午打卡开始时间（8点）
    private static final int MORNING_END = 12;   // 上午打卡结束时间（12点）
    private static final int AFTERNOON_START = 13;// 下午打卡开始时间（13点）
    private static final int AFTERNOON_END = 18; // 下午打卡结束时间（18点）
    private static final int MORNING_LATE = 9;   // 上午迟到时间（9点）
    private static final int AFTERNOON_EARLY = 17;// 下午早退时间（17点30分，此处简化为17点）

    /**
     * 普通用户：查询个人考勤列表（自动填充状态标签）
     */
    @Override
    public List<SysAttendance> getMyAttendanceList( Date startDate, Date endDate) {
        // 1. 获取当前登录用户ID（若依权限工具类）
        Long userId = SecurityUtils.getUserId();
        // 2. 查询个人考勤数据
        List<SysAttendance> attendanceList = attendanceMapper.selectMyAttendanceList(userId, startDate, endDate);
//        // 3. 填充状态标签（从字典表获取，如1→“正常”）
//        return attendanceList.stream().map(attendance -> {
//            String statusLabel = dictDataService.selectDictLabel("user_attendance_status", attendance.getStatus().toString());
//            attendance.setStatusLabel(statusLabel);
//            return attendance;
//        }).collect(Collectors.toList());
        return attendanceList;

    }

    /**
     * 上午打卡
     */
    @Override
    public AjaxResult morningPunch(Date checkDate) {
        // 1. 初始化参数（默认当天打卡）
        if (checkDate == null) {
            checkDate = new Date();
        }
        Long userId = SecurityUtils.getUserId();
        String userName = SecurityUtils.getUsername();
        Date now = new Date();

        // 2. 时间校验：是否在上午打卡时段
        int currentHour = Integer.parseInt(HOUR_FORMAT.format(now));
        if (currentHour < MORNING_START || currentHour >= MORNING_END) {
            return AjaxResult.error("当前不在上午打卡时段（8:00-12:00），无法打卡");
        }

        // 3. 校验是否已打卡
        SysAttendance todayAttendance = attendanceMapper.selectTodayAttendance(userId, checkDate);
        if (todayAttendance != null && todayAttendance.getMorning() != null) {
            return AjaxResult.error("已完成上午打卡，无需重复操作");
        }

        // 4. 计算考勤状态（正常/迟到）
        Long status = calculateStatus(now, null);

        // 5. 构建打卡记录（新增/更新）
        SysAttendance attendance = new SysAttendance();
        if (todayAttendance != null) {
            BeanUtils.copyBeanProp(attendance, todayAttendance); // 复制已有数据
        }
        attendance.setUserId(userId);
        attendance.setCheckDate(checkDate);
        attendance.setMorning(now);
        attendance.setStatus(Math.toIntExact(status));
        attendance.setCreateBy(userName);
        attendance.setCreateTime(now);
        attendance.setUpdateBy(userName);
        attendance.setUpdateTime(now);

        // 6. 保存记录（ON DUPLICATE KEY 处理更新）
        attendanceMapper.insertOrUpdateAttendance(attendance);
        return AjaxResult.success("上午打卡成功", attendance);
    }

    /**
     * 下午打卡
     */
    @Override
    public AjaxResult afternoonPunch(Date checkDate) {
        // 1. 初始化参数（默认当天打卡）
        if (checkDate == null) {
            checkDate = new Date();
        }
        Long userId = SecurityUtils.getUserId();
        String userName = SecurityUtils.getUsername();
        Date now = new Date();

        // 2. 时间校验：是否在下午打卡时段
        int currentHour = Integer.parseInt(HOUR_FORMAT.format(now));
        if (currentHour < AFTERNOON_START || currentHour >= AFTERNOON_END) {
            return AjaxResult.error("当前不在下午打卡时段（13:00-18:00），无法打卡");
        }

        // 3. 校验是否已打卡
        SysAttendance todayAttendance = attendanceMapper.selectTodayAttendance(userId, checkDate);
        if (todayAttendance != null && todayAttendance.getAfternoon() != null) {
            return AjaxResult.error("已完成下午打卡，无需重复操作");
        }

        // 4. 计算考勤状态（结合上午打卡情况）
        Date morningTime = (todayAttendance != null) ? todayAttendance.getMorning() : null;
        Long status = calculateStatus(morningTime, now);

        // 5. 构建打卡记录（新增/更新）
        SysAttendance attendance = new SysAttendance();
        if (todayAttendance != null) {
            BeanUtils.copyBeanProp(attendance, todayAttendance); // 复制已有数据
        }
        attendance.setUserId(userId);
        attendance.setCheckDate(checkDate);
        attendance.setAfternoon(now);
        attendance.setStatus(Math.toIntExact(status));
        attendance.setCreateBy(userName);
        attendance.setCreateTime(now);
        attendance.setUpdateBy(userName);
        attendance.setUpdateTime(now);

        // 6. 保存记录
        attendanceMapper.insertOrUpdateAttendance(attendance);
        return AjaxResult.success("下午打卡成功", attendance);
    }

    /**
     * 私有方法：根据上午/下午打卡时间计算考勤状态
     * @param morningTime 上午打卡时间（null表示未打）
     * @param afternoonTime 下午打卡时间（null表示未打）
     * @return 状态值（1=正常，2=迟到，3=早退，4=上午缺卡，5=下午缺卡，6=全天缺卡，23=迟到+早退）
     */
    private Long calculateStatus(Date morningTime, Date afternoonTime) {
        boolean isMorningNormal = false; // 上午是否正常
        boolean isMorningLate = false;   // 上午是否迟到
        boolean isAfternoonNormal = false;// 下午是否正常
        boolean isAfternoonEarly = false;// 下午是否早退

        // 1. 判断上午状态
        if (morningTime != null) {
            int morningHour = Integer.parseInt(HOUR_FORMAT.format(morningTime));
            isMorningNormal = (morningHour >= MORNING_START && morningHour < MORNING_LATE);
            isMorningLate = (morningHour >= MORNING_LATE && morningHour < MORNING_END);
        }

        // 2. 判断下午状态
        if (afternoonTime != null) {
            int afternoonHour = Integer.parseInt(HOUR_FORMAT.format(afternoonTime));
            isAfternoonNormal = (afternoonHour >= AFTERNOON_EARLY && afternoonHour < AFTERNOON_END);
            isAfternoonEarly = (afternoonHour >= AFTERNOON_START && afternoonHour < AFTERNOON_EARLY);
        }

        // 3. 组合状态（对照字典表 `user_attendance_status`）
        if (morningTime != null && afternoonTime != null) {
            if (isMorningNormal && isAfternoonNormal) {
                return 1L; // 正常
            } else if (isMorningLate && isAfternoonEarly) {
                return 23L; // 迟到+早退
            } else if (isMorningLate) {
                return 2L; // 迟到
            } else if (isAfternoonEarly) {
                return 3L; // 早退
            }
        } else if (afternoonTime != null) {
            return 4L; // 上午缺卡
        } else if (morningTime != null) {
            return 5L; // 下午缺卡
        }
        return 6L; // 全天缺卡
    }
}
